package admin_tenant

import (
	"gitee.com/theegg/go-brick/app/model/partner/partners"
	"gitee.com/theegg/go-brick/app/service/app"
	"gitee.com/theegg/go-brick/app/service/help/cstruct"
	"gitee.com/theegg/go-brick/database/seed/seed_partner"
	"gitee.com/theegg/go-brick/database/tables"
	"github.com/gin-gonic/gin"
	"strconv"
)

// @title GetPartnerList
// @description 获取内容详情
func GetPartnerList(c *gin.Context) {
	// 检验参数
	var validaParams partners.PartnerQueryParams
	if err := c.ShouldBind(&validaParams); err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	// 查询数据
	data, err := partners.GetDataList(cstruct.StructToMap(validaParams))
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), data)
		return
	}

	// 区域选项
	data["db_region_options"] = partners.DbRegionOptions

	app.NewResponse(c).JsonI18nReturn(6001000, nil, data)
	return
}

// @title PartnerAdd
// @description 添加商户
func PartnerAdd(c *gin.Context) {
	idStr := c.PostForm("id")
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	var modelPartner *partners.Partners
	var errGet error
	if id > 0 {
		modelPartner, errGet = partners.GetItemById(id)
		if errGet != nil {
			app.NewResponse(c).JsonReturn(false, errGet.Error(), nil)
			return
		}
	} else {
		modelPartner = new(partners.Partners)
	}

	// 校验参数
	var validaParams partners.PartnerAddParams
	if err := c.ShouldBind(&validaParams); err != nil {
		app.NewResponse(c).JsonReturn(false, "bind-json-"+err.Error(), nil)
		return
	}

	errAu := modelPartner.AddOrUpdate(validaParams, nil)
	if errAu != nil {
		app.NewResponse(c).JsonReturn(false, errAu.Error(), nil)
		return
	}

	app.NewResponse(c).JsonReturn(true, "获取数据成功", nil)
	return
}

// @title PartnerInitDatabase
// @description 商户数据生成
func PartnerInitDatabase(c *gin.Context) {
	partner, err := getTargetPartnerFromParams(c)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	errPing := app.Db(partner.PartnerSign, partner.DbRegion).Ping()
	if errPing != nil {
		app.NewResponse(c).JsonReturn(false, "数据链接不存在", nil)
		return
	}

	_, ok := tables.GenPartnerTable()
	if ok {
		seed_partner.InitPartner()
	} else {
		app.NewResponse(c).JsonReturn(false, "生成数据库失败!", nil)
		return
	}

	app.NewResponse(c).JsonReturn(true, "生成数据库成功", nil)
	return
}

// @title PartnerStatus
// @description 修改商户状态
func PartnerStatus(c *gin.Context) {
	model, err := getTargetPartnerFromParams(c)
	if err != nil {
		app.NewResponse(c).JsonReturn(false, err.Error(), nil)
		return
	}

	_, errStatus := model.ModifyStatus()
	if errStatus != nil {
		app.NewResponse(c).JsonReturn(false, errStatus.Error(), nil)
		return
	}

	app.NewResponse(c).JsonI18nReturn(6001000, nil, nil)
	return

}

/** =========================== 辅助查询 ============================ **/
// @title getTargetPartnerFromParams
// @description 内置方法　通过参数id获取目标对象
func getTargetPartnerFromParams(c *gin.Context) (*partners.Partners, error) {
	id := c.PostForm("id")
	if id == "" {
		return nil, app.NewError("对不起, 管理员ID不能为空")
	}

	// ID 转换格式
	int64Id, errParse := strconv.ParseInt(id, 10, 64)
	if errParse != nil {
		return nil, app.NewError("对不起, 目标用户ID格式不正确")
	}

	// 获取对象
	item, errTarget := partners.GetItemById(int64Id)
	if errTarget != nil {
		return nil, app.NewError(errTarget)
	}

	// 目标需要存在
	if item == nil {
		return nil, app.NewError("对不起, 目标不存在")
	}

	return item, nil
}
